package main

import "fmt"

type User struct {
	Name string
	Age  int
}

//这个例子更清楚的演示了，经常看到在结构体或方法中，前面加 * 或加 & 的含义。

func main() {
	//user1实际上保存的是结构体对象
	user1 := User{Name: "Tom", Age: 11}

	//user2实际上保存的是地址
	user2 := &User{Name: "Jim", Age: 22}

	//因为结构体的地址隐式调用，user1和user2，的如下操作，是没有任何区别的
	user1.Age++
	user2.Age++
	fmt.Println(user1, *user2)

	//因为user1是一个结构体对象，而这个方法要求传入地址，所以要加一个&号
	incAge10(&user1)
	//user2已经是一个地址了，直接传入即可
	incAge10(user2)
	fmt.Println(user1, *user2)
}

//这个方法，要求传入的是一个User的地址
func incAge10(u *User) {
	//同上，能直接使用u.Age，参考19行的注释
	u.Age += 10
}
